package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.TurmaDisciplinaBD;

public class TurmaDisciplinaDAO {
    
    //Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodos unique, auto incremento, chave composta
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDTurmaDisciplina;
    ResultSet rs;
    
    public boolean inserirAssociacao(TurmaDisciplinaBD tdbd){
        try
        {
            Connection con = conBD.conectar();
            BDTurmaDisciplina = con.createStatement();  

            //resgatar codigo da turma, disciplina e do professor a partir dos nomes             
            rs = BDTurmaDisciplina.executeQuery("SELECT t.cod_turma, d.cod_dis, p.cod_prof "
                    + " from turma t, disciplina d, professor p "
                    + " where t.nome_turma = '"+tdbd.getNomeTurma()+"' and "
                    + " d.nome_dis = '"+tdbd.getNomeDisciplina()+"' and "
                    + " p.nome_prof = '"+tdbd.getNomeProfessor()+"' "); 

            rs.last();
            int capturaTurma = rs.getInt("t.cod_turma");
            int capturaDisciplina = rs.getInt("d.cod_dis");
            int capturaProfessor = rs.getInt("p.cod_prof");
            
            //verificar as chaves compostas
            if(metBD.verificarChaveComposta("turmadisciplina", 
                    "cod_turma", String.valueOf(capturaTurma), 
                    "cod_dis", String.valueOf(capturaDisciplina))){
             
                //Inserirndo no Banco de Dados
                BDTurmaDisciplina.execute("INSERT INTO turmadisciplina VALUES('"+capturaTurma+"',"
                        + " '" + capturaDisciplina + "','" + tdbd.getSemestre() + "',"
                        + " '"+capturaProfessor+"');");
                
                //Mensagem de OK
                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso",
                "Cadastro", JOptionPane.INFORMATION_MESSAGE);
                
                //Fechando conexão
                con.close();
                return true;
            }
            else{
                //Mensagem de erro
                JOptionPane.showMessageDialog(null,"Disciplina já foi cadastrada para esta turma", 
                "Disciplina já existe", JOptionPane.ERROR_MESSAGE);
                
                //Fechando conexão
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }         
        return false;
    }    
    
    public List<TurmaDisciplinaBD> filtro(String campo, String valor) {      
        List<TurmaDisciplinaBD> listaFiltro = new ArrayList(); 
        try { 
            Connection con = conBD.conectar();
            BDTurmaDisciplina = con.createStatement();

            //recupera os dados da turma de acordo com o nome da turma
            rs = BDTurmaDisciplina.executeQuery("SELECT td.cod_turma, td.cod_dis,"
                    + " td.semestre_td, td.cod_prof, p.nome_prof, d.nome_dis"
                    + " from turma t, turmadisciplina td, professor p, disciplina d "
                    + " where t.cod_turma = td.cod_turma and "
                    + " td.cod_prof = p.cod_prof and "
                    + " td.cod_dis = d.cod_dis and "
                    + " "+campo+" = '"+valor+"' "
                    + " order by (td.semestre_td)");
            
            if (rs != null) {                                
                    while (rs.next()) {
                        TurmaDisciplinaBD td = new TurmaDisciplinaBD();
                                               
                        //Seta os dados
                        td.setCodTurma(rs.getInt("td.cod_turma"));
                        td.setCodDisciplina(rs.getInt("td.cod_dis"));
                        td.setSemestre(rs.getInt("td.semestre_td")); 
                        td.setCodProfessor(rs.getInt("td.cod_prof"));
                        td.setNomeProfessor(rs.getString("p.nome_prof"));
                        td.setNomeDisciplina(rs.getString("d.nome_dis"));
                        // add na lista
                        listaFiltro.add(td); 
                }
                con.close();
                return listaFiltro; 
          }else {
                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }   
    
    public boolean excluirDisciplina(TurmaDisciplinaBD tdbd){
        String sql = "delete from turmadisciplina where cod_turma = ? and "
                + " cod_dis = ? ";   
              
        try {
            Connection con = conBD.conectar();
            BDTurmaDisciplina= con.createStatement(); 

            //resgatar codigo da turma, a partir do nome             
            rs = BDTurmaDisciplina.executeQuery("SELECT t.cod_turma, d.cod_dis "
                    + " from turma t, disciplina d, turmadisciplina td "
                    + " where t.cod_turma = td.cod_turma and"
                    + " td.cod_dis = d.cod_dis and "
                    + " t.nome_turma = '"+tdbd.getNomeTurma()+"' and "
                    + " d.nome_dis = '"+tdbd.getNomeDisciplina()+"' ");
            rs.last();
            int capturaTurma = rs.getInt("t.cod_turma");
            int capturaDisciplina = rs.getInt("d.cod_dis");
            
            //verificar se cod_dis é foreign key da relação turma-aluno-disciplina
            BDTurmaDisciplina= con.createStatement();
            rs = BDTurmaDisciplina.executeQuery("SELECT count(cod_dis) "
                    + " FROM turmaalunodisciplina "
                    + " where cod_dis = '"+capturaDisciplina+"' "
                    + " and cod_turma = '"+capturaTurma+"' ");
            rs.first();  
            int capturaForeign = rs.getInt(1);
            
            if(capturaForeign >= 1){
                JOptionPane.showMessageDialog(null,"Disciplina contém alunos cadastrados,"
                        + " não pode ser excluida", 
                        "Excluir", JOptionPane.INFORMATION_MESSAGE);
                con.close();
                return false;                   
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(capturaTurma)));
                ps.setString(2, (String.valueOf(capturaDisciplina)));

                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }                   
            }           
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   } 

    public boolean alterarTurmaDisciplina(TurmaDisciplinaBD tdbd){
        String sql = "update turmadisciplina set "
                + " semestre_td = ? , cod_prof = ? ";
        sql += " where cod_turma = ? and cod_dis = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            PreparedStatement ps = con.prepareStatement(sql);
                        
            ps.setInt(1, (tdbd.getSemestre()));
            ps.setInt(2, (tdbd.getCodProfessor()));
            ps.setInt(3, (tdbd.getCodTurma()));
            ps.setInt(4, tdbd.getCodDisciplina());

            if (ps.executeUpdate() > 0) {
                JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso", 
                        "Alterar", JOptionPane.INFORMATION_MESSAGE);
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }                                                                
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e.getMessage() , 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }        
}


